# 系统提示词，各种检索用的提示词，统一管理RAG流程中的各类Prompts
# 作用：通过langchain的Prompts类，将不同场景的提示词如：问答生成、查询分解等等，统一管理起来，方便调用
"""管理Prompt模板，支持不同任务"""

from langchain.prompts import PromptTemplate

class RAGPrompts:
    """
    RAGPrompts类，用于管理RAG流程中的各类Prompts
    """
    @staticmethod
    def rag_prompt():
        return PromptTemplate(template="""
            1、你是一个智能助手，帮助用户回答问题。
            2、如果提供了上下文，请直接根据上下文回答问题。
            3、如果没有上下文，请根据用户的问题，生成一个回答。
            4、如果用户的问题无法回答，请回复“我无法回答这个问题”，并说明原因。
            5、请保持回答的准确性和完整性。
        上下文：{context}
        用户问题：{question}
        """)
    @staticmethod
    def hyde_prompt():
        """根据问题，假设生成答案，用于RAG流程中的假设回答"""
        return PromptTemplate(
            template="""  
            假设你是用户，想了解以下问题，请生成一个简短的假设答案：  
            问题: {query}  
            假设答案:  
            """,
            #   定义输入变量
            input_variables=["query"],
        )

    #   定义子查询生成的 Prompt 模板
    @staticmethod
    def subquery_prompt():
        """将复杂查询分解为多个简单子查询，每行一个子查询"""
        #   创建并返回 PromptTemplate 对象
        return PromptTemplate(
            template="""  
            将以下复杂查询分解为多个简单子查询，每行一个子查询：  
            查询: {query}  
            子查询:  
            """,
            #   定义输入变量
            input_variables=["query"],
        )

    #   定义回溯问题生成的 Prompt 模板
    @staticmethod
    def backtracking_prompt():
        """回溯检索问题，迭代优化搜索"""
        return PromptTemplate(
            template="""  
            将以下复杂查询简化为一个更简单的问题：  
            查询: {query}  
            简化问题:  
            """,
            #   定义输入变量
            input_variables=["query"],
        )

if __name__ == '__main__':
    rag_prompt = RAGPrompts.rag_prompt()
    print(rag_prompt.format(context="中国的工业制造能力很强大", question="中国的工业制造能力有哪些？"))
